/**
 * 通用工具类
 * @version 1.0.0
 */

/**
 * 数组求和
 * @param {Array} arr 
 * @returns 
 */
export function arraySum(arr) {
    if (!arr || arr.length == 0) {
        return 0;
    }
    if (typeof (arr) == 'string') {
        arr = arr.split(' ');
    }
    return arr.reduce((a, b) => { return parseInt(a) + parseInt(b) })
}

/**
 * 数组去重
 * @param {Array} arr 
 * @param {String} objKey 去重对象的键名
 * @returns 
 * @example 
 * arrayUnique([{a:1},{a:2},{a:3},{a:2}], 'a'); // 复杂数组去重
 * arrayUnique([1,2,3,2]); // 简单数组去重
 */
export function arrayUnique(arr, objKey = '') {
    if (objKey) {
        return [...new Map(arr.map(item => [item[objKey], item])).values()];
    }
    return [...new Set(arr)];
}

/**
 * 从数组随机取出指定数量的元素
 * @param {Array} arr 
 * @param {Number} num 
 * @returns 
 */
export function arrayRandom(arr, num = 1) {
    if (num == 1) {
        return arr[Math.floor(Math.random() * arr.length)];
    }
    return [...arr].sort(() => 0.5 - Math.random()).slice(0, num);
}

/**
 * 判断数值是否在某范围
 * @param {Number} num 数值
 * @param {Array} range 数值范围，示例：[min, max]
 * @returns {Boolean}
 */
export function inRange(num, range) {
    num = parseInt(num);
    const [min, max] = range.split('-').map(v => parseInt(v));
    return num >= min && num <= max;
}

/**
 * 将数组切割成小数组
 * @param {Array} arr 
 * @param {Number} size 
 */
export function arrayChunk(arr, size) {
    const list = [];
    for (let i = 0; i < arr.length; i += size) {
        list.push(arr.slice(i, i + size));
    }
}

/**
 * 快速计算二维数组的组合数量
 * 用途：快速计算购物车的号码组合数量
 * @param {Array} arr 
 */
export function combinationCount(data) {
    let n = 1;
    data.forEach(arr => {
        n = n * arr.length;
    })
    return n;
}

/**
 * 计算阶乘
 * @param {Number} n 
 * @returns 
 */
export function factorial(n) {
    let ans = 1;
    if (n == 0) {
        return 1;
    }
    for (let i = 2; i <= n; i++) {
        ans = ans * i;
    }
    return ans;
}

/**
 * 复制到粘贴板
 * @param {String} text 
 */
export function copyText(text) {
    if (navigator.clipboard) {
        // Chrome 浏览器规定，只有 HTTPS 协议的页面才能使用这个 API。不过，开发环境（localhost）允许使用非加密协议。
        // link: https://www.ruanyifeng.com/blog/2021/01/clipboard-api.html
        navigator.clipboard.writeText(text);
    } else {
        let elInput = document.createElement('textarea');
        elInput.value = text;
        document.body.appendChild(elInput);
        elInput.select();
        document.execCommand('copy');
        document.body.removeChild(elInput);
    }
}
export function message(data, message = 'success', code = 200) {
    return { data, message, code };
}
